package com.fengniaoxls.fengniaonewretail.jpush;

import android.accessibilityservice.AccessibilityService;
import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;

import androidx.annotation.RequiresApi;

import com.fengniaoxls.fengniaonewretail.app.App;
import com.fengniaoxls.fengniaonewretail.commom.constants.Constants;
import com.fengniaoxls.fengniaonewretail.utils.SPUtils;

import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class VoiceAccessibilityService extends AccessibilityService {
    private static VoiceAccessibilityService service;
    /**
     * 定时任务
     */
    private ScheduledThreadPoolExecutor scheduled;
    /**
     * 初始化
     */
    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        service = this;
    }

    @Override
    protected boolean onKeyEvent(KeyEvent event) {
        Log.e("TAG", "event.getKeyCode()  " + event.getKeyCode());
        switch (event.getKeyCode()) {
            //电源键
            case KeyEvent.KEYCODE_POWER:
                Log.e("TAG","点击电源键");


                break;
        }
        return super.onKeyEvent(event);
    }
    public void timingTask() {
//        if ((boolean) SPUtils.get(App.getInstance().getApplicationContext(),
//                (String) SPUtils.get(App.getInstance().getApplicationContext(), Constants.USER_CODE, "")
//                        + Constants.VOICE_OPEN_STATUS, false)) {
            //延时1s，每隔300000(5分钟)毫秒执行一次run方法
            if (scheduled != null) {
                /**
                 * 0表示首次执行任务的延迟时间，5表示每次执行任务的间隔时间，TimeUnit.MINUTES执行的时间间隔数值单位
                 * 间隔单位毫秒：TimeUnit.MILLISECONDS
                 * 间隔单位秒：TimeUnit.SECONDS
                 * 间隔单位分钟：TimeUnit.MINUTES
                 * 间隔单位小时：TimeUnit.HOURS
                 * 间隔单位天：TimeUnit.DAYS
                 * scheduleAtFixedRate和scheduleWithFixedDelay的区别：
                 * scheduleAtFixedRate：是上一个任务开始执行之后延迟设定时间再执行，是从上一个任务开始时计时，
                 *                      但对于运行时长超过延迟时长的任务，会等上一个任务执行完之后，下一个任务才开始执行，
                 *                      此时，延时没有任何意义。
                 * scheduleWithFixedDelay：scheduleWithFixedDelay是在上一个任务结束执行之后延迟设定时间再执行，
                 *                          是从上一个任务结束时开始计算。
                 */
                scheduled.scheduleWithFixedDelay(new Runnable() {
                    @Override
                    public void run() {
                        Message message = new Message();
                        message.what = 1;
                        handler.sendMessage(message);
                    }
                }, 0, 2, TimeUnit.SECONDS);
            }
//        }
    }
    @SuppressLint("HandlerLeak")
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 1) {
//                getJPushStatus();
                Log.e("TAG","获取状态");
            }
            super.handleMessage(msg);
        }
    };

    /**
     * 新事件。此事件归调用方所有，此方法返回后不能使用。希望在此方法返回后使用事件的服务应进行复制。
     * 实现辅助功能
     *
     * @param event
     */
    @RequiresApi(api = Build.VERSION_CODES.P)
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        switch (event.getEventType()) {
            case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
                Log.e("TAG","变化");

//                if (scheduled == null) {
//                    Log.e("TAG", "锁屏定时任务");
//                    scheduled = new ScheduledThreadPoolExecutor(2);
//                }
//                timingTask();

                break;
        }
    }

    /**
     * 回调以中断可访问性反馈。
     */
    @Override
    public void onInterrupt() {
        service = null;
    }

    public static boolean isStart() {
        return service != null;
    }

    /**
     * 点击该控件
     *
     * @return true表示点击成功
     */
    public static boolean clickView(AccessibilityNodeInfo nodeInfo) {
        if (nodeInfo != null) {
            if (nodeInfo.isClickable()) {
                nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                return true;
            } else {
                AccessibilityNodeInfo parent = nodeInfo.getParent();
                if (parent != null) {
                    boolean b = clickView(parent);
                    parent.recycle();
                    if (b) return true;
                }
            }
        }
        return false;
    }

}
